From d02d5312945a80a21f1d1efac04dbe885c5a86d8 Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Sun, 31 Jul 2022 08:34:21 -0600 Subject: [PATCH] change return type of pretty_deg_format to QString. (#896) this fixes memory leak in garmin_gpi, and adds a test. enhance testing of pretty_deg_format to get coverage of dms. --- defs.h | 2 +- garmin_gpi.cc | 2 +- garmin_txt.cc | 2 +- html.cc | 10 ++++------ reference/garmin_gpi_position~gpx.gpi | Bin 0 -> 11818 bytes reference/pretty_degree.csv | 9 +++++++++ reference/pretty_degree0.csv | 9 +++++++++ reference/pretty_degree1.csv | 9 +++++++++ reference/pretty_degree2.csv | 9 +++++++++ testo.d/garmin_gpi.test | 4 ++++ testo.d/unicsv.test | 8 ++++++++ text.cc | 11 +++++------ unicsv.cc | 22 +++++++--------------- util.cc | 24 ++++++++++++------------ 14 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 reference/garmin_gpi_position~gpx.gpi create mode 100644 reference/pretty_degree.csv create mode 100644 reference/pretty_degree0.csv create mode 100644 reference/pretty_degree1.csv create mode 100644 reference/pretty_degree2.csv diff --git a/defs.h b/defs.h index eed1a18f3..e78886083 100644 --- a/defs.h +++ b/defs.h @@ -1085,7 +1085,7 @@ char* strip_html(const utf_string*); char* strip_nastyhtml(const QString& in); char* convert_human_date_format(const char* human_datef); /* "MM,YYYY,DD" -> "%m,%Y,%d" */ char* convert_human_time_format(const char* human_timef); /* "HH+mm+ss" -> "%H+%M+%S" */ -char* pretty_deg_format(double lat, double lon, char fmt, const char* sep, int html); /* decimal -> dd.dddd or dd mm.mmm or dd mm ss */ +QString pretty_deg_format(double lat, double lon, char fmt, const char* sep, bool html); /* decimal -> dd.dddd or dd mm.mmm or dd mm ss */ QString get_filename(const QString& fname); /* extract the filename portion */ diff --git a/garmin_gpi.cc b/garmin_gpi.cc index f7a0c7cdc..450fcbd6d 100644 --- a/garmin_gpi.cc +++ b/garmin_gpi.cc @@ -758,7 +758,7 @@ GarminGPIFormat::wdata_compute_size(writer_data_t* data) const str = wpt->notes; } } else if (opt_pos) { - str = pretty_deg_format(wpt->latitude, wpt->longitude, 's', " ", 0); + str = pretty_deg_format(wpt->latitude, wpt->longitude, 's', " ", false); } diff --git a/garmin_txt.cc b/garmin_txt.cc index 06e1935f1..5928d595b 100644 --- a/garmin_txt.cc +++ b/garmin_txt.cc @@ -360,7 +360,7 @@ print_position(const Waypoint* wpt) *fout << "#####\n"; fatal(MYNAME ": %s (%s) is outside of convertible area \"%s\"!\n", wpt->shortname.isEmpty() ? "Waypoint" : qPrintable(wpt->shortname), - pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, 0), + qPrintable(pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, false)), gt_get_mps_grid_longname(grid_index, MYNAME)); } } diff --git a/html.cc b/html.cc index d46cc9f2e..8f3c07735 100644 --- a/html.cc +++ b/html.cc @@ -66,9 +66,9 @@ HtmlFormat::html_disp(const Waypoint* wpt) const gbfprintf(file_out, "\n
\n", CSTR(wpt->shortname)); gbfprintf(file_out, "\n"); gbfprintf(file_out, "

%s - ",(global_opts.synthesize_shortnames) ? CSTR(mkshort_from_wpt(mkshort_handle, wpt)) : CSTR(wpt->shortname)); - char* cout = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", 1); - gbfprintf(file_out, "%s (%d%c %6.0f %7.0f)", cout, utmz, utmzc, utme, utmn); - xfree(cout); + gbfprintf(file_out, "%s (%d%c %6.0f %7.0f)", + CSTR(pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", true)), + utmz, utmzc, utme, utmn); if (wpt->altitude != unknown_alt) { gbfprintf(file_out, " alt:%d", (int)((altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude)); } @@ -161,11 +161,9 @@ HtmlFormat::html_disp(const Waypoint* wpt) const if (logpart) { double lat = xml_attribute(logpart->attributes, "lat").toDouble(); double lon = xml_attribute(logpart->attributes, "lon").toDouble(); - char* coordstr = pretty_deg_format(lat, lon, degformat[2], " ", 1); gbfprintf(file_out, "%s
\n", - coordstr); - xfree(coordstr); + CSTR(pretty_deg_format(lat, lon, degformat[2], " ", true))); } logpart = xml_findfirst(curlog, "groundspeak:text"); diff --git a/reference/garmin_gpi_position~gpx.gpi b/reference/garmin_gpi_position~gpx.gpi new file mode 100644 index 0000000000000000000000000000000000000000..7991d7cc8893f29e2844b4e863f372854daf99c4 GIT binary patch literal 11818 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 M|1%muGq6AZ1^iL53IG5A literal 0 HcmV?d00001 diff --git a/reference/pretty_degree.csv b/reference/pretty_degree.csv new file mode 100644 index 000000000..d64d9aac4 --- /dev/null +++ b/reference/pretty_degree.csv @@ -0,0 +1,9 @@ +lat|lon|desc +0.134°S|0.135°W|point0 +0.134°N|0.135°E|point1 +1.134°S|1.135°W|point2 +1.134°N|1.135°E|point3 +10.134°S|10.135°W|point4 +10.134°N|10.135°E|point5 +80.134°S|100.135°W|point6 +80.134°N|100.135°E|point7 diff --git a/reference/pretty_degree0.csv b/reference/pretty_degree0.csv new file mode 100644 index 000000000..03c62fd22 --- /dev/null +++ b/reference/pretty_degree0.csv @@ -0,0 +1,9 @@ +No,Latitude,Longitude,Name +1,S0.13400,W0.13500,"point0" +2,N0.13400,E0.13500,"point1" +3,S1.13400,W1.13500,"point2" +4,N1.13400,E1.13500,"point3" +5,S10.13400,W10.13500,"point4" +6,N10.13400,E10.13500,"point5" +7,S80.13400,W100.13500,"point6" +8,N80.13400,E100.13500,"point7" diff --git a/reference/pretty_degree1.csv b/reference/pretty_degree1.csv new file mode 100644 index 000000000..e6a41b4f8 --- /dev/null +++ b/reference/pretty_degree1.csv @@ -0,0 +1,9 @@ +No,Latitude,Longitude,Name +1,S0 08.040,W0 08.100,"point0" +2,N0 08.040,E0 08.100,"point1" +3,S1 08.040,W1 08.100,"point2" +4,N1 08.040,E1 08.100,"point3" +5,S10 08.040,W10 08.100,"point4" +6,N10 08.040,E10 08.100,"point5" +7,S80 08.040,W100 08.100,"point6" +8,N80 08.040,E100 08.100,"point7" diff --git a/reference/pretty_degree2.csv b/reference/pretty_degree2.csv new file mode 100644 index 000000000..52c969efb --- /dev/null +++ b/reference/pretty_degree2.csv @@ -0,0 +1,9 @@ +No,Latitude,Longitude,Name +1,"S0 08'02.4""","W0 08'06.0""","point0" +2,"N0 08'02.4""","E0 08'06.0""","point1" +3,"S1 08'02.4""","W1 08'06.0""","point2" +4,"N1 08'02.4""","E1 08'06.0""","point3" +5,"S10 08'02.4""","W10 08'06.0""","point4" +6,"N10 08'02.4""","E10 08'06.0""","point5" +7,"S80 08'02.4""","W100 08'06.0""","point6" +8,"N80 08'02.4""","E100 08'06.0""","point7" diff --git a/testo.d/garmin_gpi.test b/testo.d/garmin_gpi.test index 15df6508e..a58c3b175 100644 --- a/testo.d/garmin_gpi.test +++ b/testo.d/garmin_gpi.test @@ -31,6 +31,10 @@ compare ${TMPDIR}/garmin_gpi_encoding.gpx ${TMPDIR}/garmin_gpi_encoding2.gpi.gpx gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi.gpx -o garmin_gpi,category="Vinícolas",hide -F ${TMPDIR}/garmin_gpi_category~gpx.gpi compare ${REFERENCE}/garmin_gpi_category~gpx.gpi ${TMPDIR}/garmin_gpi_category~gpx.gpi +# check position option +gpsbabel -i gpx -f ${REFERENCE}/garmin_gpi.gpx -o garmin_gpi,position -F ${TMPDIR}/garmin_gpi_position~gpx.gpi +compare ${REFERENCE}/garmin_gpi_position~gpx.gpi ${TMPDIR}/garmin_gpi_position~gpx.gpi + # check dual language read # spb_metro_norm.gpi from https://www.garmin.ru/download/extras/poi.php or https://files.navicom.ru/spb_metro_norm.gpi gpsbabel -i garmin_gpi,languagecode=RU -f ${REFERENCE}/spb_metro_norm.gpi -o gpx -F ${TMPDIR}/spb_metro_norm_ru~gpi.gpx diff --git a/testo.d/unicsv.test b/testo.d/unicsv.test index 63de3e97d..6c31bba94 100644 --- a/testo.d/unicsv.test +++ b/testo.d/unicsv.test @@ -46,3 +46,11 @@ gpsbabel -i unicsv -f ${REFERENCE}/humantodec1.csv -o gpx -F ${TMPDIR}/humantode compare ${REFERENCE}/humantodec.gpx ${TMPDIR}/humantodec1.gpx gpsbabel -i unicsv -f ${REFERENCE}/humantodec2.csv -o gpx -F ${TMPDIR}/humantodec2.gpx compare ${REFERENCE}/humantodec.gpx ${TMPDIR}/humantodec2.gpx + +# pretty degree format +gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=0 -F ${TMPDIR}/pretty_degree0.csv +compare ${REFERENCE}/pretty_degree0.csv ${TMPDIR}/pretty_degree0.csv +gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=1 -F ${TMPDIR}/pretty_degree1.csv +compare ${REFERENCE}/pretty_degree1.csv ${TMPDIR}/pretty_degree1.csv +gpsbabel -i unicsv -f ${REFERENCE}/pretty_degree.csv -o unicsv,grid=2 -F ${TMPDIR}/pretty_degree2.csv +compare ${REFERENCE}/pretty_degree2.csv ${TMPDIR}/pretty_degree2.csv diff --git a/text.cc b/text.cc index 9b5e478ca..313c379c0 100644 --- a/text.cc +++ b/text.cc @@ -77,18 +77,18 @@ TextFormat::text_disp(const Waypoint* wpt) GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude, &utme, &utmn, &utmz, &utmzc); - char* tmpout1 = pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", 0); if (wpt->altitude != unknown_alt) { xasprintf(&altout, " alt:%d", (int)((altunits[0]=='f')?METERS_TO_FEET(wpt->altitude):wpt->altitude)); } else { altout = (char*) ""; } - xasprintf(&tmpout2, "%s (%d%c %6.0f %7.0f)%s", tmpout1, utmz, utmzc, utme, utmn, altout); + xasprintf(&tmpout2, "%s (%d%c %6.0f %7.0f)%s", + CSTR(pretty_deg_format(wpt->latitude, wpt->longitude, degformat[2], " ", false)), + utmz, utmzc, utme, utmn, altout); gbfprintf(file_out, "%-16s %59s\n", (global_opts.synthesize_shortnames) ? CSTR(mkshort_from_wpt(mkshort_handle, wpt)) : CSTR(wpt->shortname), tmpout2); xfree(tmpout2); - xfree(tmpout1); if (altout[0]) { xfree(altout); } @@ -168,9 +168,8 @@ TextFormat::text_disp(const Waypoint* wpt) if (logpart) { double lat = xml_attribute(logpart->attributes, "lat").toDouble(); double lon = xml_attribute(logpart->attributes, "lon").toDouble(); - char* coordstr = pretty_deg_format(lat, lon, degformat[2], " ", 0); - gbfprintf(file_out, "%s\n", coordstr); - xfree(coordstr); + gbfprintf(file_out, "%s\n", + CSTR(pretty_deg_format(lat, lon, degformat[2], " ", false))); } logpart = xml_findfirst(curlog, "groundspeak:text"); diff --git a/unicsv.cc b/unicsv.cc index 6788f6dac..b88fc9a03 100644 --- a/unicsv.cc +++ b/unicsv.cc @@ -1113,7 +1113,7 @@ UnicsvFormat::unicsv_fatal_outside(const Waypoint* wpt) const *fout << "#####\n"; fatal(MYNAME ": %s (%s) is outside of convertible area of grid \"%s\"!\n", wpt->shortname.isEmpty() ? "Waypoint" : qPrintable(wpt->shortname), - pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, 0), + qPrintable(pretty_deg_format(wpt->latitude, wpt->longitude, 'd', nullptr, false)), gt_get_mps_grid_longname(unicsv_grid_idx, MYNAME)); } @@ -1306,7 +1306,6 @@ void UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) { double lat, lon, alt; - char* cout = nullptr; const geocache_data* gc_data = nullptr; unicsv_waypt_ct++; @@ -1327,22 +1326,19 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) switch (unicsv_grid_idx) { case grid_lat_lon_ddd: - cout = pretty_deg_format(lat, lon, 'd', unicsv_fieldsep, 0); - *fout << cout; + *fout << pretty_deg_format(lat, lon, 'd', unicsv_fieldsep, false); break; case grid_lat_lon_dmm: - cout = pretty_deg_format(lat, lon, 'm', unicsv_fieldsep, 0); - *fout << cout; + *fout << pretty_deg_format(lat, lon, 'm', unicsv_fieldsep, false); break; case grid_lat_lon_dms: { - cout = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, 0); - char* sep = strchr(cout, ','); - *sep = '\0'; - QString tmp = csv_enquote(cout, kUnicsvQuoteChar); + QString position = pretty_deg_format(lat, lon, 's', unicsv_fieldsep, false); + auto sep = position.indexOf(unicsv_fieldsep); + QString tmp = csv_enquote(position.left(sep), kUnicsvQuoteChar); *fout << tmp << unicsv_fieldsep; - tmp = csv_enquote(sep+1, kUnicsvQuoteChar); + tmp = csv_enquote(position.mid(sep+1), kUnicsvQuoteChar); *fout << tmp; } break; @@ -1393,10 +1389,6 @@ UnicsvFormat::unicsv_waypt_disp_cb(const Waypoint* wpt) break; } - if (cout) { - xfree(cout); - } - if FIELD_USED(fld_shortname) { unicsv_print_str(shortname); } diff --git a/util.cc b/util.cc index 981972dae..362b680a9 100644 --- a/util.cc +++ b/util.cc @@ -1123,10 +1123,10 @@ convert_human_time_format(const char* human_timef) * sep = string between lat and lon (separator) * html = 1 for html output otherwise text */ -char* -pretty_deg_format(double lat, double lon, char fmt, const char* sep, int html) +QString +pretty_deg_format(double lat, double lon, char fmt, const char* sep, bool html) { - char* result; + QString result; char latsig = lat < 0 ? 'S':'N'; char lonsig = lon < 0 ? 'W':'E'; int latint = abs((int) lat); @@ -1139,17 +1139,17 @@ pretty_deg_format(double lat, double lon, char fmt, const char* sep, int html) sep = " "; /* default " " */ } if (fmt == 'd') { /* ddd */ - xasprintf(&result, "%c%6.5f%s%s%c%6.5f%s", - latsig, fabs(lat), html?"°":"", sep, - lonsig, fabs(lon), html?"°":""); + result = QStringLiteral("%1%2%3%4%5%6%7") + .arg(latsig).arg(fabs(lat), 6, 'f', 5).arg(html ? "°" : "", sep) + .arg(lonsig).arg(fabs(lon), 6, 'f', 5).arg(html ? "°" : ""); } else if (fmt == 's') { /* dms */ - xasprintf(&result, "%c%d%s%02d'%04.1f\"%s%c%d%s%02d'%04.1f\"", - latsig, latint, html?"°":" ", (int)latmin, latsec, sep, - lonsig, lonint, html?"°":" ", (int)lonmin, lonsec); + result = QStringLiteral("%1%2%3%4'%5\"%6%7%8%9%10'%11\"") + .arg(latsig).arg(latint).arg(html ? "°" : " ").arg((int)latmin, 2, 10, QChar('0')).arg(latsec, 4, 'f', 1, QChar('0')).arg(sep) + .arg(lonsig).arg(lonint).arg(html ? "°" : " ").arg((int)lonmin, 2, 10, QChar('0')).arg(lonsec, 4, 'f', 1, QChar('0')); } else { /* default dmm */ - xasprintf(&result, "%c%d%s%06.3f%s%c%d%s%06.3f", - latsig, latint, html?"°":" ", latmin, sep, - lonsig, lonint, html?"°":" ", lonmin); + result = QStringLiteral("%1%2%3%4%5%6%7%8%9") + .arg(latsig).arg(latint).arg(html ? "°" : " ").arg(latmin, 6, 'f', 3, QChar('0')).arg(sep) + .arg(lonsig).arg(lonint).arg(html ? "°" : " ").arg(lonmin, 6, 'f', 3, QChar('0')); } return result; } -- 2.30.2